/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import io.InfoClieMesDTO;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author facundo
 */
public class InfoClieMes {

    public ArrayList<InfoClieMesDTO> getInformesClieMes(String año) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery(""
                    +"SELECT persona.nombre , sum(cuota.monto)  as monto , cast('enero'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-01-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-01-31') GROUP BY persona.nombre UNION "
                    + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('febrero'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-02-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-02-29') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('marzo'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-03-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-03-31') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('abril'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-04-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-04-30') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('mayo'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-05-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-05-31') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('junio'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-06-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-06-30') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('julio'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-07-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-07-31') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('agosto'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-08-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-08-31') GROUP BY persona.nombre) UNION"
                     + "(SELECT persona.nombre , sum(cuota.monto)  as monto , cast('septiembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-09-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-09-30') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('octubre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-10-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-10-31') GROUP BY persona.nombre) UNION"
                     + "(SELECT persona.nombre , sum(cuota.monto)  as monto , cast('noviembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-11-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-11-30') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('diciembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-12-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-12-31') GROUP BY persona.nombre)");

                   
            ArrayList<InfoClieMesDTO> lista = new ArrayList();
            while (rs.next()) {
                if (rs.getString("mes").equals("enero")) {
                    InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                    informeUnMes.setCliente(rs.getString("nombre"));
                    informeUnMes.setEnero(rs.getDouble("monto"));
                    lista.add(informeUnMes);
                } else {
                    if (rs.getString("mes").equals("febrero")) {
                        InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                        if (informe != null) {
                            informe.setFebrero(rs.getDouble("monto"));
                        } else {
                            InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                            informeUnMes.setCliente(rs.getString("nombre"));
                            informeUnMes.setFebrero(rs.getDouble("monto"));
                            lista.add(informeUnMes);
                        }
                    } else {
                        if (rs.getString("mes").equals("marzo")) {
                            InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                            if (informe != null) {
                                informe.setMarzo(rs.getDouble("monto"));
                            } else {
                                InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                informeUnMes.setCliente(rs.getString("nombre"));
                                informeUnMes.setMarzo(rs.getDouble("monto"));
                                lista.add(informeUnMes);
                            }
                        } else {
                            if (rs.getString("mes").equals("abril")) {
                                InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                if (informe != null) {
                                    informe.setAbril(rs.getDouble("monto"));
                                } else {
                                    InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                    informeUnMes.setCliente(rs.getString("nombre"));
                                    informeUnMes.setAbril(rs.getDouble("monto"));
                                    lista.add(informeUnMes);
                                }
                            } else {
                                if (rs.getString("mes").equals("mayo")) {
                                    InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                    if (informe != null) {
                                        informe.setMayo(rs.getDouble("monto"));
                                    } else {
                                        InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                        informeUnMes.setCliente(rs.getString("nombre"));
                                        informeUnMes.setMayo(rs.getDouble("monto"));
                                        lista.add(informeUnMes);
                                    }
                                } else {
                                    if (rs.getString("mes").equals("junio")) {
                                        InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                        if (informe != null) {
                                            informe.setJunio(rs.getDouble("monto"));
                                        } else {
                                            InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                            informeUnMes.setCliente(rs.getString("nombre"));
                                            informeUnMes.setJunio(rs.getDouble("monto"));
                                            lista.add(informeUnMes);
                                        }
                                    } else {
                                        if (rs.getString("mes").equals("julio")) {
                                            InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                            if (informe != null) {
                                                informe.setJulio(rs.getDouble("monto"));
                                            } else {
                                                InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                                informeUnMes.setCliente(rs.getString("nombre"));
                                                informeUnMes.setJulio(rs.getDouble("monto"));
                                                lista.add(informeUnMes);
                                            }
                                        } else {
                                            if (rs.getString("mes").equals("agosto")) {
                                                InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                                if (informe != null) {
                                                    informe.setAgosto(rs.getDouble("monto"));
                                                } else {
                                                    InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                                    informeUnMes.setCliente(rs.getString("nombre"));
                                                    informeUnMes.setAgosto(rs.getDouble("monto"));
                                                    lista.add(informeUnMes);
                                                }
                                            } else {
                                                if (rs.getString("mes").equals("septiembre")) {
                                                    InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                                    if (informe != null) {
                                                        informe.setSeptiembre(rs.getDouble("monto"));
                                                    } else {
                                                        InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                                        informeUnMes.setCliente(rs.getString("nombre"));
                                                        informeUnMes.setSeptiembre(rs.getDouble("monto"));
                                                        lista.add(informeUnMes);
                                                    }
                                                } else {
                                                    if (rs.getString("mes").equals("octubre")) {
                                                        InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                                        if (informe != null) {
                                                            informe.setOctubre(rs.getDouble("monto"));
                                                        } else {
                                                            InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                                            informeUnMes.setCliente(rs.getString("nombre"));
                                                            informeUnMes.setOctubre(rs.getDouble("monto"));
                                                            lista.add(informeUnMes);
                                                        }
                                                    } else {
                                                        if (rs.getString("mes").equals("noviembre")) {
                                                            InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                                            if (informe != null) {
                                                                informe.setNoviembre(rs.getDouble("monto"));
                                                            } else {
                                                                InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                                                informeUnMes.setCliente(rs.getString("nombre"));
                                                                informeUnMes.setNoviembre(rs.getDouble("monto"));
                                                                lista.add(informeUnMes);
                                                            }
                                                        } else {
                                                            if (rs.getString("mes").equals("diciembre")) {
                                                                InfoClieMesDTO informe = InformeDeNombre(rs.getString("nombre"), lista);
                                                                if (informe != null) {
                                                                    informe.setDiciembre(rs.getDouble("monto"));
                                                                } else {
                                                                    InfoClieMesDTO informeUnMes = new InfoClieMesDTO();
                                                                    informeUnMes.setCliente(rs.getString("nombre"));
                                                                    informeUnMes.setDiciembre(rs.getDouble("monto"));
                                                                    lista.add(informeUnMes);
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            rs.close();
            Iterator<InfoClieMesDTO> it = lista.iterator();
            while (it.hasNext()) {
                InfoClieMesDTO fila = it.next();
                fila.calcularTotal();
            }
            
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer los pagos de la cuota desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }

    private InfoClieMesDTO InformeDeNombre(String nombre, ArrayList<InfoClieMesDTO> lista) {
        InfoClieMesDTO informe = null;
        Iterator it = lista.iterator();
        while (it.hasNext()) {
            InfoClieMesDTO informe2 = (InfoClieMesDTO) it.next();
            if (nombre.equals(informe2.getCliente())) {
                informe = informe2;
            }
        }
        return informe;
    }

    public ArrayList<InfoClieMesDTO> getInformesClieMesResumen(String año) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery(""
                    +" SELECT tabla2.mes, sum(tabla2.monto)as monto, cast('total'AS CHAR CHARACTER SET utf8) as tipo "
                    + " FROM"
                    +" (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('enero'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-01-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-01-31') GROUP BY persona.nombre UNION "
                    + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('febrero'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-02-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-02-29') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('marzo'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-03-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-03-31') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('abril'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-04-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-04-30') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('mayo'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-05-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-05-31') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('junio'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-06-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-06-30') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('julio'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-07-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-07-31') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('agosto'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-08-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-08-31') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('septiembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-09-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-09-30') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('octubre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-10-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-10-31') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('noviembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-11-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-11-30') GROUP BY persona.nombre) UNION"
                     + " (SELECT persona.nombre , sum(cuota.monto)  as monto , cast('diciembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota WHERE "
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan)  AND  (cuota.fechaVencimiento >=  '"+año+ "-12-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+año+ "-12-31') GROUP BY persona.nombre)) as tabla2 GROUP BY tabla2.mes"
                    + " UNION"
                    + ""
                    + ""
                    + " (SELECT tabla3.mes, sum(tabla3.monto) as monto, cast('pagado'AS CHAR CHARACTER SET utf8) as tipo "
                    + " FROM"
                    +" (SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('enero'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-01-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-01-31') GROUP BY persona.nombre UNION"
                    + " (SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('febrero'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-02-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-02-29') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('marzo'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-03-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-03-31') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('abril'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-04-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-04-30') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('mayo'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-05-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-05-31') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('junio'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-06-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-06-30') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('julio'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-07-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-07-31') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('agosto'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-08-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-08-31') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('septiembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-09-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-09-30') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('octubre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-10-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-10-31') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('noviembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-11-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-11-30') GROUP BY persona.nombre) UNION"
                    + "(SELECT persona.nombre , sum(pago.montoPagado)  as monto , cast('diciembre'AS CHAR CHARACTER SET utf8) as Mes   FROM persona, venta,plan,cuota,pago WHERE"
                    + " (persona.id=venta.idCliente) AND (venta.id = plan.idVenta) AND  (plan.idPlan = cuota.idPlan) AND (cuota.id = pago.idCuota) AND  (cuota.fechaVencimiento >=  '"+año+ "-12-01')"
                    + " AND (cuota.fechaVencimiento <=  '"+ año + "-12-31') GROUP BY persona.nombre))"
                   + " as tabla3 GROUP BY tabla3.mes)");

            ArrayList<InfoClieMesDTO> lista = new ArrayList();
            InfoClieMesDTO informeUnMes1 = new InfoClieMesDTO();
            informeUnMes1.setCliente("Total");
            InfoClieMesDTO informeUnMes2 = new InfoClieMesDTO();
            informeUnMes2.setCliente("Cobrado");
            InfoClieMesDTO informeUnMes3 = new InfoClieMesDTO();
            informeUnMes3.setCliente("Por Cobrar");
            informeUnMes1.setEnero(0.0);
            informeUnMes2.setEnero(0.0);
            informeUnMes1.setFebrero(0.0);
            informeUnMes2.setFebrero(0.0);
            informeUnMes1.setMarzo(0.0);
            informeUnMes2.setMarzo(0.0);
            informeUnMes1.setAbril(0.0);
            informeUnMes2.setAbril(0.0);
            informeUnMes1.setMayo(0.0);
            informeUnMes2.setMayo(0.0);
            informeUnMes1.setJunio(0.0);
            informeUnMes2.setJunio(0.0);
            informeUnMes1.setJulio(0.0);
            informeUnMes2.setJulio(0.0);
            informeUnMes1.setAgosto(0.0);
            informeUnMes2.setAgosto(0.0);
            informeUnMes1.setSeptiembre(0.0);
            informeUnMes2.setSeptiembre(0.0);
            informeUnMes1.setOctubre(0.0);
            informeUnMes2.setOctubre(0.0);
            informeUnMes1.setNoviembre(0.0);
            informeUnMes2.setNoviembre(0.0);
            informeUnMes1.setDiciembre(0.0);
            informeUnMes2.setDiciembre(0.0);
            lista.add(informeUnMes1);
            lista.add(informeUnMes2);
            lista.add(informeUnMes3);
            while (rs.next()) {
                if (rs.getString("mes").equals("enero")) {
                    if (rs.getString("tipo").equals("total")) {
                        informeUnMes1.setEnero(rs.getDouble("monto"));
                    } else {
                        informeUnMes2.setEnero(rs.getDouble("monto"));
                    }
                } else {
                    if (rs.getString("mes").equals("febrero")) {
                        if (rs.getString("tipo").equals("total")) {
                            informeUnMes1.setFebrero(rs.getDouble("monto"));
                        } else {
                            informeUnMes2.setFebrero(rs.getDouble("monto"));
                        }
                    } else {
                        if (rs.getString("mes").equals("marzo")) {
                            if (rs.getString("tipo").equals("total")) {
                                informeUnMes1.setMarzo(rs.getDouble("monto"));
                            } else {
                                informeUnMes2.setMarzo(rs.getDouble("monto"));
                            }
                        } else {
                            if (rs.getString("mes").equals("abril")) {
                                if (rs.getString("tipo").equals("total")) {
                                    informeUnMes1.setAbril(rs.getDouble("monto"));
                                } else {
                                    informeUnMes2.setAbril(rs.getDouble("monto"));
                                }
                            } else {
                                if (rs.getString("mes").equals("mayo")) {
                                    if (rs.getString("tipo").equals("total")) {
                                        informeUnMes1.setMayo(rs.getDouble("monto"));
                                    } else {
                                        informeUnMes2.setMayo(rs.getDouble("monto"));
                                    }
                                } else {
                                    if (rs.getString("mes").equals("junio")) {
                                        if (rs.getString("tipo").equals("total")) {
                                            informeUnMes1.setJunio(rs.getDouble("monto"));
                                        } else {
                                            informeUnMes2.setJunio(rs.getDouble("monto"));
                                        }
                                    } else {
                                        if (rs.getString("mes").equals("julio")) {
                                            if (rs.getString("tipo").equals("total")) {
                                                informeUnMes1.setJulio(rs.getDouble("monto"));
                                            } else {
                                                informeUnMes2.setJulio(rs.getDouble("monto"));
                                            }
                                        } else {
                                            if (rs.getString("mes").equals("agosto")) {
                                                if (rs.getString("tipo").equals("total")) {
                                                    informeUnMes1.setAgosto(rs.getDouble("monto"));
                                                } else {
                                                    informeUnMes2.setAgosto(rs.getDouble("monto"));
                                                }
                                            } else {
                                                if (rs.getString("mes").equals("septiembre")) {
                                                    if (rs.getString("tipo").equals("total")) {
                                                        informeUnMes1.setSeptiembre(rs.getDouble("monto"));
                                                    } else {
                                                        informeUnMes2.setSeptiembre(rs.getDouble("monto"));
                                                    }
                                                } else {
                                                    if (rs.getString("mes").equals("octubre")) {
                                                        if (rs.getString("tipo").equals("total")) {
                                                            informeUnMes1.setOctubre(rs.getDouble("monto"));
                                                        } else {
                                                            informeUnMes2.setOctubre(rs.getDouble("monto"));
                                                        }
                                                    } else {
                                                        if (rs.getString("mes").equals("noviembre")) {
                                                            if (rs.getString("tipo").equals("total")) {
                                                                informeUnMes1.setNoviembre(rs.getDouble("monto"));
                                                            } else {
                                                                informeUnMes2.setNoviembre(rs.getDouble("monto"));
                                                            }
                                                        } else {
                                                            if (rs.getString("mes").equals("diciembre")) {
                                                                if (rs.getString("tipo").equals("total")) {
                                                                    informeUnMes1.setDiciembre(rs.getDouble("monto"));
                                                                } else {
                                                                    informeUnMes2.setDiciembre(rs.getDouble("monto"));
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            informeUnMes3.setEnero(informeUnMes1.getEnero()-informeUnMes2.getEnero());
            informeUnMes3.setFebrero(informeUnMes1.getFebrero()-informeUnMes2.getFebrero());
            informeUnMes3.setMarzo(informeUnMes1.getMarzo()-informeUnMes2.getMarzo());
            informeUnMes3.setAbril(informeUnMes1.getAbril()-informeUnMes2.getAbril());
            informeUnMes3.setMayo(informeUnMes1.getMayo()-informeUnMes2.getMayo());
            informeUnMes3.setJunio(informeUnMes1.getJunio()-informeUnMes2.getJunio());
            informeUnMes3.setJulio(informeUnMes1.getJulio()-informeUnMes2.getJulio());
            informeUnMes3.setAgosto(informeUnMes1.getAgosto()-informeUnMes2.getAgosto());
            informeUnMes3.setSeptiembre(informeUnMes1.getSeptiembre()-informeUnMes2.getSeptiembre());
            informeUnMes3.setOctubre(informeUnMes1.getOctubre()-informeUnMes2.getOctubre());
            informeUnMes3.setNoviembre(informeUnMes1.getNoviembre()-informeUnMes2.getNoviembre());
            informeUnMes3.setDiciembre(informeUnMes1.getDiciembre()-informeUnMes2.getDiciembre());
            informeUnMes1.setTotal(informeUnMes1.getDiciembre()+informeUnMes1.getNoviembre()+informeUnMes1.getOctubre()+informeUnMes1.getSeptiembre()+informeUnMes1.getAgosto()+informeUnMes1.getJulio()+informeUnMes1.getJunio()+informeUnMes1.getMayo()+informeUnMes1.getAbril()+informeUnMes1.getMarzo()+informeUnMes1.getFebrero()+informeUnMes1.getEnero());
            informeUnMes2.setTotal(informeUnMes2.getDiciembre()+informeUnMes2.getNoviembre()+informeUnMes2.getOctubre()+informeUnMes2.getSeptiembre()+informeUnMes2.getAgosto()+informeUnMes2.getJulio()+informeUnMes2.getJunio()+informeUnMes2.getMayo()+informeUnMes2.getAbril()+informeUnMes2.getMarzo()+informeUnMes2.getFebrero()+informeUnMes2.getEnero());
            informeUnMes3.setTotal(informeUnMes3.getDiciembre()+informeUnMes3.getNoviembre()+informeUnMes3.getOctubre()+informeUnMes3.getSeptiembre()+informeUnMes3.getAgosto()+informeUnMes3.getJulio()+informeUnMes3.getJunio()+informeUnMes3.getMayo()+informeUnMes3.getAbril()+informeUnMes3.getMarzo()+informeUnMes3.getFebrero()+informeUnMes3.getEnero());
            
            rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer los pagos de la cuota desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);

        }
    }
}
